// ./utils/metrics.util.js

const client = require('prom-client');
const logger = require('../config/logger.config');

// -----------------------------------------------------------
// 1. 注册表和默认指标
// -----------------------------------------------------------
// 创建默认注册表，所有指标都将注册到这个表中
const register = new client.Registry();

// 收集 Node.js 默认指标 (CPU, 内存, GC等)
client.collectDefaultMetrics({ register });

// -----------------------------------------------------------
// 2. 自定义 HTTP 请求指标 (Histogram)
// -----------------------------------------------------------

// 定义 HTTP 请求延迟的直方图 (Histogram)
// labelNames: 用于区分指标的标签 (例如：方法和路由)
// buckets: 用于划分延迟时间段的数组 (单位：秒)
const httpRequestDurationMicroseconds = new client.Histogram({
    name: 'http_request_duration_seconds',
    help: 'HTTP 请求处理时间（秒）',
    labelNames: ['method', 'route', 'status_code'],
    buckets: [0.003, 0.03, 0.1, 0.3, 1.5, 5.0, 10.0], // 常见延迟分桶
});

// 将自定义指标注册到注册表
register.registerMetric(httpRequestDurationMicroseconds);

// -----------------------------------------------------------
// 3. 自定义 HTTP 请求计数器 (Counter)
// -----------------------------------------------------------

const httpRequestsTotal = new client.Counter({
    name: 'http_requests_total',
    help: 'HTTP 请求总数',
    labelNames: ['method', 'route', 'status_code'],
});
register.registerMetric(httpRequestsTotal);

/**
 * 中间件：记录 HTTP 请求的性能指标
 * @param {object} req - 请求对象
 * @param {object} res - 响应对象
 * @param {function} next - 下一个中间件
 */
const metricsMiddleware = (req, res, next) => {
    // 忽略指标路由本身的请求，避免循环和噪音
    if (req.originalUrl === '/metrics') {
        return next();
    }

    // 计时开始
    const end = httpRequestDurationMicroseconds.startTimer();

    // 在响应结束后执行
    res.on('finish', () => {
        const route = req.route ? req.route.path : req.originalUrl;

        // 记录请求总数
        httpRequestsTotal.labels(req.method, route, res.statusCode).inc();

        // 记录请求延迟
        end({
            method: req.method,
            route: route,
            status_code: res.statusCode,
        });
    });

    next();
};

// 导出所有必要的组件
module.exports = {
    register,
    metricsMiddleware,
    // 如果需要，可以添加更多自定义指标的导出，供 Controller 或 Service 使用
    // 例如：dbQueryCounter = new client.Counter({ name: 'db_queries_total', ... })
};
